/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import static Conexao.ConexaoBancoDeDados.getConexao;
import Model.BeanEstado;
import Model.BeanPessoa;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;

/**
 *
 * @author ebastos
 */
public class DAOPessoa {

    public DAOPessoa() {

    }

    private BeanPessoa GetPessoa(ResultSet rs) {
        try {
            if (rs.first()) {
                BeanPessoa pessoa = new BeanPessoa();
                pessoa.setCPF(rs.getLong("CPF"));
                pessoa.setDtnascimento(rs.getDate("dtnascimento", Calendar.getInstance()));
                pessoa.setNome(rs.getString("nome"));
                pessoa.setSexo(rs.getBoolean("sexo"));
                pessoa.setEmail(rs.getString("email"));
                pessoa.setESTADOID(rs.getInt("ESTADOID"));
                BeanEstado estado = pessoa.getEstado();
                pessoa.setEstado(estado);
                pessoa.setCidade(rs.getString("cidade"));
                pessoa.setLogradouro(rs.getString("logradouro"));
                pessoa.setNumero(rs.getInt("numero"));
                if (rs.wasNull()) {
                    pessoa.setNumero(-1);
                }
                pessoa.setCep(rs.getString("cep"));
                pessoa.setBairro(rs.getString("bairro"));
                return pessoa;
            } else {
                //Não retornou nenhuma linha
                return null;
            }
        } catch (SQLException e) {
            return null;
        }
    }

    public ArrayList<BeanPessoa> getPessoas() {
        try (Connection conn = getConexao()) {
            String sql = "SELECT * FROM pessoa;";
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();

            return GetPessoas(rs);
        } catch (SQLException e) {
            return null;
        }
    }

    private ArrayList<BeanPessoa> GetPessoas(ResultSet rs) {
        try {
            ArrayList<BeanPessoa> retorno = new ArrayList<>();

            while (rs.next()) {
                BeanPessoa pessoa = new BeanPessoa();
                pessoa.setCPF(rs.getLong("CPF"));
                pessoa.setDtnascimento(rs.getDate("dtnascimento", Calendar.getInstance()));
                pessoa.setNome(rs.getString("nome"));
                pessoa.setSexo(rs.getBoolean("sexo"));
                pessoa.setEmail(rs.getString("email"));
                pessoa.setESTADOID(rs.getInt("ESTADOID"));
                pessoa.setCidade(rs.getString("cidade"));
                pessoa.setLogradouro(rs.getString("logradouro"));
                pessoa.setNumero(rs.getInt("numero"));
                if (rs.wasNull()) {
                    pessoa.setNumero(-1);
                }
                pessoa.setCep(rs.getString("cep"));
                pessoa.setBairro(rs.getString("bairro"));
                retorno.add(pessoa);
            }
            return retorno;

        } catch (SQLException e) {
            return null;
        }
    }

    public BeanPessoa RetornaPessoa(long CPF) {
        try (Connection conn = getConexao()) {
            String sql;
            sql = "SELECT * FROM pessoa WHERE CPF = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, String.valueOf(CPF));

            ResultSet rs = ps.executeQuery();
            return GetPessoa(rs);
        } catch (SQLException e) {
            return null;
        }
    }

    public BeanPessoa RetornaPessoa(String nome) {
        try (Connection conn = getConexao()) {
            String sql;
            sql = "SELECT * FROM pessoa WHERE nome LIKE ? LIMIT 1;";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, "%" + nome + "%");

            ResultSet rs = ps.executeQuery();
            return GetPessoa(rs);
        } catch (SQLException e) {
            return null;
        }
    }

    public void Atualizar(BeanPessoa pessoa) {
        try (Connection conn = getConexao()) {
            String sql;
            sql = "UPDATE pessoa SET nome = '?', sexo = ?, dtnascimento = '?', email = '?' WHERE CPF = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, String.valueOf(pessoa.getNome()));
            ps.setString(2, String.valueOf(pessoa.isSexo()));
            ps.setString(3, String.valueOf(pessoa.getDtnascimento()));
            ps.setString(4, String.valueOf(pessoa.getEmail()));
            ps.setString(5, String.valueOf(pessoa.getCPF()));
            ps.executeQuery();
        } catch (SQLException e) {
        }
    }

    public void Inserir(BeanPessoa pessoa) {
        try (Connection conn = getConexao()) {
            
            String sql = "INSERT INTO pessoa (CPF,ESTADOID,nome,sexo,dtnascimento,email,cidade,logradouro,numero,cep,bairro) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
              
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setLong(1, pessoa.getCPF());
            ps.setInt(2, pessoa.getESTADOID());
            ps.setString(3, String.valueOf(pessoa.getNome()));
            ps.setBoolean(4, pessoa.isSexo());
            ps.setDate(5, new java.sql.Date(pessoa.getDtnascimento().toInstant().toEpochMilli()));
            ps.setString(6, String.valueOf(pessoa.getEmail()));
            ps.setString(7, String.valueOf(pessoa.getCidade()));
            ps.setString(8, String.valueOf(pessoa.getLogradouro()));
            ps.setInt(9, pessoa.getNumero());
            ps.setString(10, String.valueOf(pessoa.getCep()));
            ps.setString(11, String.valueOf(pessoa.getBairro()));
            ps.execute();
           
        } catch (SQLException e) {
        }
    }

}
